﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net.Mail;
using System.Text;
using System.Net;

namespace ZWZ.Web.Codes
{
    public class EmailHelper
    {
        #region 配置参数
        /// <summary>
        /// 邮箱登陆名
        /// </summary>
        private string EmailUser { get { return Config.ConfigAdapter.SiteSettingMgr.Groups["EmailSetting"].Settings["UserName"].Value.Trim(); } }
        /// <summary>
        /// 邮箱密码　
        /// </summary>
        private string EmailPassword { get { return Config.ConfigAdapter.SiteSettingMgr.Groups["EmailSetting"].Settings["Password"].Value.Trim(); } }
        /// <summary>
        /// 发送邮件的邮箱地址
        /// </summary>
        private string EmailAddress { get { return Config.ConfigAdapter.SiteSettingMgr.Groups["EmailSetting"].Settings["Address"].Value.Trim(); } }
        /// <summary>
        /// 接收回复的邮箱地址
        /// </summary>
        private string RepayEmail { get { return Config.ConfigAdapter.SiteSettingMgr.Groups["EmailSetting"].Settings["RepayEmail"].Value.Trim(); } }
        /// <summary>
        /// Stmp服务地址
        /// </summary>
        private string StmpHost { get { return Config.ConfigAdapter.SiteSettingMgr.Groups["EmailSetting"].Settings["Stmp"].Value.Trim(); } }
        /// <summary>
        /// 发送邮件显示名称
        /// </summary>
        private string DisplayName { get { return Config.ConfigAdapter.SiteSettingMgr.Groups["BaseSetting"].Settings["CompanyName"].Value.Trim(); } }
        /// <summary>
        /// Stmp端口
        /// </summary>
        private int StmpPort { get { int result = 0; int.TryParse(Config.ConfigAdapter.SiteSettingMgr.Groups["EmailSetting"].Settings["Port"].Value, out result); return result; } }

        #endregion
        /// <summary>
        /// 发送邮件
        /// </summary>
        /// <param name="ToAddress">邮件的接收者，支持群发，多个地址之间用 半角逗号 分开</param>
        /// <param name="CC">邮件的抄送者，支持群发，多个邮件地址之间用 半角逗号 分开</param>
        /// <param name="subject">邮件标题</param>
        /// <param name="body">邮件正文 </param>
        /// <param name="attachments">邮件附件</param>
        public void Send(string ToAddress, string CC, string subject, string body, List<Attachment> attachments = null)
        {
            MailMessage mm = new MailMessage(); //实例化一个邮件类 
            mm.Priority = MailPriority.High; //邮件的优先级，分为 Low, Normal, High，通常用 Normal即可 
            mm.From = new MailAddress(EmailAddress, DisplayName, Encoding.GetEncoding(936));
            mm.ReplyToList.Add(new MailAddress(RepayEmail, DisplayName, Encoding.GetEncoding(936)));
            //ReplyTo 表示对方回复邮件时默认的接收地址，即：你用一个邮箱发信，但却用另一个来收信
            //上面后两个参数的意义， 同 From 的意义 
            if (!string.IsNullOrEmpty(CC)) mm.CC.Add(CC);
            //邮件的抄送者，支持群发，多个邮件地址之间用 半角逗号 分开
            //当然也可以用全地址，如下：
            //mm.CC.Add(new MailAddress("a@163.com", "抄送者A", Encoding.GetEncoding(936)));
            //mm.CC.Add(new MailAddress("b@163.com", "抄送者B", Encoding.GetEncoding(936)));
            //mm.CC.Add(new MailAddress("c@163.com", "抄送者C", Encoding.GetEncoding(936)));
            //mm.Bcc.Add("d@163.com,e@163.com");
            //邮件的密送者，支持群发，多个邮件地址之间用 半角逗号 分开
            //mm.Sender = new MailAddress("xxx@xxx.com", "邮件发送者", Encoding.GetEncoding(936));
            //可以任意设置，此信息包含在邮件头中，但并不会验证有效性，也不会显示给收件人
            //说实话，我不知道有啥实际作用，大家可不理会，也可不写此项 
            mm.To.Add(ToAddress);
            //邮件的接收者，支持群发，多个地址之间用 半角逗号 分开
            //当然也可以用全地址添加mm.To.Add(new MailAddress("g@163.com", "接收者g", Encoding.GetEncoding(936)));mm.To.Add(new MailAddress("h@163.com", "接收者h", Encoding.GetEncoding(936))); 
            mm.Subject = subject;
            //邮件标题
            mm.SubjectEncoding = Encoding.GetEncoding(936);
            // 这里非常重要，如果你的邮件标题包含中文，这里一定要指定，否则对方收到的极有可能是乱码。
            // 936是简体中文的pagecode，如果是英文标题，这句可以忽略不用 
            mm.IsBodyHtml = true;
            //邮件正文是否是HTML格式
            mm.BodyEncoding = Encoding.GetEncoding(936);
            //邮件正文的编码， 设置不正确， 接收者会收到乱码
            mm.Body = body;//邮件正文 
            //mm.Attachments.Add(new Attachment(@"d:a.doc", System.Net.Mime.MediaTypeNames.Application.Rtf));
            if (attachments != null)
            {
                foreach (var a in attachments)
                {
                    mm.Attachments.Add(a);
                }
            }
            //添加附件，第二个参数，表示附件的文件类型，可以不用指定
            //可以添加多个附件mm.Attachments.Add( new Attachment( @"d:b.doc") ); 
            Send(mm);
        }
        /// <summary>
        /// 发送邮件
        /// </summary>
        /// <param name="mm"></param>
        public void Send(MailMessage mm)
        {
            SmtpClient smtp = new SmtpClient();
            //实例化一个SmtpClientsmtp.DeliveryMethod = SmtpDeliveryMethod.Network; 
            //将smtp的出站方式设为 Networksmtp.EnableSsl = false;
            //smtp服务器是否启用SSL加密 
            smtp.Host = StmpHost;
            //指定 smtp 服务器地址
            if (StmpPort != 0) smtp.Port = StmpPort;
            //指定 smtp 服务器的端口，默认是25，如果采用默认端口，可省去 
            //如果你的SMTP服务器不需要身份认证，则使用下面的方式，不过，目前基本没有不需要认证的了
            smtp.UseDefaultCredentials = true;//如果需要认证，则用下面的方式
            smtp.Credentials = new NetworkCredential(EmailUser, EmailPassword);
            smtp.Send(mm);
            //发送邮件，如果不返回异常， 则大功告成了。
        }
    }
}